package com.dsbj.mp.icardservice.utils.beanfactory;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @Description 普通类调用Spring注解方式的Service层bean
 *
 * @param
 * @return
 * @author RICK，cjw 2019-12-19
 */
@Component
public class SpringBeanFactoryUtil implements ApplicationContextAware {

	private static ApplicationContext appCtx;
	
	/**
	 * TODO: 此方法可以把ApplicationContext对象inject到当前类中作为一个静态成员变量。
	 * 
	 * @Auhor: RICK
	 * @Date : 2016年11月1日
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		System.out.println("\n执行了springBeanFactoryUtil.setApplicationContext()方法,传入的applicationContext="+applicationContext);
		appCtx = applicationContext;
	}

	/**
	 * TODO: 获取ApplicationContext
	 * 
	 * @Auhor: RICK
	 * @Date : 2016年11月1日
	 */
	public static ApplicationContext getApplicationContext() {
		return appCtx;
	}

	/**
	 * TODO: 这是一个便利的方法，帮助我们快速得到一个BEAN
	 * 
	 * @Auhor: RICK
	 * @Date : 2016年11月1日
	 */
	public static Object getBean(String beanName) {
		return appCtx.getBean(beanName);
	}
	
	/**
	 * 根据类型获得对应对象。
	 * 
	 * @param requiredType
	 * @return
	 * snail 2018-09-16
	 */
	public static <T> T getBean(Class<T> requiredType) {
		return appCtx.getBean(requiredType);
	}
	
	/**
	 * 通过name,以及Clazz返回指定的Bean。
	 * @param
	 * @return
	 * @author cjw 2019-12-19
	 */
	public static <T> T getBean(String beanName, Class<T> clazz) {
		return appCtx.getBean(beanName, clazz);
	}

}
